package ventanas;

import java.util.Calendar;
import java.util.List;
import javax.swing.JFrame;
import negocio.Medico;
import negocio.Sistema;
import negocio.Turno;
import org.freixas.jcalendar.JCalendar;
import util.ModeloTabla;
import javax.swing.JLabel;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.ColumnSpec;
import com.jgoodies.forms.layout.RowSpec;
import com.jgoodies.forms.factories.FormFactory;
import controladores.ControladorCalendario;
import controladores.ControladorVentanaAgenda;
import javax.swing.DefaultComboBoxModel;
import javax.swing.SwingConstants;
import javax.swing.JComboBox;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.ListSelectionModel;
import javax.swing.border.LineBorder;
import java.awt.Color;
import javax.swing.JScrollPane;
import java.awt.Dimension;
import javax.swing.JButton;

public class VentanaAgenda extends JFrame {
	private static final long serialVersionUID = 1L;
	private ControladorCalendario controladorJcalendar;
	private ControladorVentanaAgenda controlador;
	private JCalendar calendario ;
	private JComboBox<Medico> combo;
	private DefaultComboBoxModel<Medico> modeloCombo;
	private Sistema s;
	private JTable tabla;
	private JLabel lblTurnos;
	private JScrollPane scrollPane;
	private JButton btnCambiarEstados;
	private JButton btnGenerarProximosTurnos;
	
	public VentanaAgenda() {
		setTitle("Agenda");
		this.controladorJcalendar = new ControladorCalendario(this);
		this.controlador = new ControladorVentanaAgenda(this);
		this.s = Sistema.obtenerInstancia();
		initComponents();
		cargarComboMedicos();
		controladorJcalendar.cargarDatosEnTabla(Calendar.getInstance());
		agregarListeners();
	}

	public void initComponents(){
		this.setVisible(true);
		setBounds(100, 100, 814, 507);
		getContentPane().setLayout(new FormLayout(new ColumnSpec[] {
				FormFactory.RELATED_GAP_COLSPEC,
				ColumnSpec.decode("max(211dlu;default)"),
				FormFactory.RELATED_GAP_COLSPEC,
				FormFactory.DEFAULT_COLSPEC,},
			new RowSpec[] {
				FormFactory.RELATED_GAP_ROWSPEC,
				FormFactory.DEFAULT_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC,
				FormFactory.DEFAULT_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC,
				RowSpec.decode("max(41dlu;default)"),
				FormFactory.RELATED_GAP_ROWSPEC,
				RowSpec.decode("max(25dlu;default)"),
				FormFactory.RELATED_GAP_ROWSPEC,
				FormFactory.DEFAULT_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC,
				RowSpec.decode("max(9dlu;default)"),
				FormFactory.RELATED_GAP_ROWSPEC,
				RowSpec.decode("max(36dlu;default)"),
				FormFactory.RELATED_GAP_ROWSPEC,
				RowSpec.decode("max(72dlu;default)"),}));
		JLabel lblAgenda = new JLabel("Agenda");
		lblAgenda.setHorizontalAlignment(SwingConstants.CENTER);
		getContentPane().add(lblAgenda, "2, 2");
		JLabel lblSeleccionarMedico = new JLabel("Seleccionar Medico");
		lblSeleccionarMedico.setHorizontalAlignment(SwingConstants.CENTER);
		getContentPane().add(lblSeleccionarMedico, "2, 4, center, default");
		lblTurnos = new JLabel("Turnos:");
		getContentPane().add(lblTurnos, "4, 4");
		combo = new JComboBox<Medico>();
		getContentPane().add(combo, "2, 6, fill, default");
		scrollPane = new JScrollPane();
		getContentPane().add(scrollPane, "4, 6, 1, 5, default, top");
		tabla = new JTable();
		tabla.setPreferredScrollableViewportSize(new Dimension(550, 500));
		tabla.setMaximumSize(new Dimension(800, 800));
		tabla.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
		tabla.setMinimumSize(new Dimension(450, 500));
		tabla.setToolTipText("");
		scrollPane.setViewportView(tabla);
		tabla.setBorder(new LineBorder(new Color(0, 0, 0), 2));
		tabla.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		tabla.setModel(new ModeloTabla());
		tabla.getColumnModel().getColumn(0).setResizable(false);
		tabla.getColumnModel().getColumn(0).setPreferredWidth(60);
		tabla.getColumnModel().getColumn(1).setResizable(false);
		tabla.getColumnModel().getColumn(1).setPreferredWidth(100);
		tabla.getColumnModel().getColumn(2).setResizable(false);
		tabla.getColumnModel().getColumn(2).setPreferredWidth(100);
		tabla.getColumnModel().getColumn(3).setResizable(false);
		tabla.getColumnModel().getColumn(3).setPreferredWidth(100);
		tabla.getColumnModel().getColumn(4).setResizable(false);
		tabla.getColumnModel().getColumn(4).setPreferredWidth(100);
		tabla.getColumnModel().getColumn(5).setResizable(false);
		tabla.getColumnModel().getColumn(5).setPreferredWidth(100);
		this.calendario = new JCalendar();
		getContentPane().add(calendario, "2, 10, center, top");
		
		btnCambiarEstados = new JButton("Cambiar Estados Turnos del D\u00EDa");
		btnCambiarEstados.setToolTipText("Seleccione aqu\u00ED para establecer un mismo estado \r\npara todos los turnos del d\u00EDa.");
		getContentPane().add(btnCambiarEstados, "2, 14, fill, center");
		
		btnGenerarProximosTurnos = new JButton("Generar Pr\u00F3ximos Turnos");
		getContentPane().add(btnGenerarProximosTurnos, "2, 16, fill, default");
		
		calendario.addDateListener(controladorJcalendar);
		this.setLocationRelativeTo(null);
		this.pack();
	}
	
	private void agregarListeners(){
		btnCambiarEstados.addActionListener(controlador);
		btnGenerarProximosTurnos.addActionListener(controlador);
		tabla.addMouseListener(controlador);
	}
	
	public void cargarComboMedicos(){
		modeloCombo = new DefaultComboBoxModel<>();
		List<Medico> medicos = s.obtenerMedicos();
		for(Medico med:medicos){
			modeloCombo.addElement(med);
		}
		combo.setModel(modeloCombo);
		combo.revalidate();
	}
	
	public String getSelectedTime(){
		int row = tabla.getSelectedRow();
		String horario = (String)tabla.getModel().getValueAt(row, 0);
		return horario;
	}
	
	public void actualizarTabla(Calendar fecha){
		List<Turno> turnos = s.obtenerTurnosEnFecha((Medico)combo.getModel().getSelectedItem(),fecha);
		TableModel modelo = tabla.getModel();
		int i = 0;
		System.out.println("Cantidad de elementos en funcion ventanaagenda: "+turnos.size());
		
		for(Turno t:turnos){
			modelo.setValueAt(t==null? "" :t.obtenerHorario(), i, 0);
			modelo.setValueAt(t==null? "" :t.getEstado(), i, 1);
			modelo.setValueAt((t==null || t.getPaciente()==null)? "" :t.getPaciente().getNombre(), i, 2);
			modelo.setValueAt((t==null || t.getPaciente()==null)? "" :t.getPaciente().getApellido(), i, 3);
			modelo.setValueAt((t==null || t.getPaciente()==null)? "" :t.getPaciente().getTelefono(), i, 4);
			modelo.setValueAt((t==null || t.getPaciente()==null)? "" :t.getPaciente().getObraSocial(), i, 5);
			i++;
		}
		tabla.revalidate();	
	}
	
	public int cantidadFilasUsadasEnTabla(){
		DefaultTableModel modelo = (DefaultTableModel) tabla.getModel();
		int i=0;
		for(; i < modelo.getRowCount(); i++){
			if(modelo.getValueAt(i, 0)==""){
				return i;
			}
		}
		return i;
	}
	
	//getters y setters
	public JTable getTabla() {
		return tabla;
	}
	
	public JCalendar getCalendario() {
		return calendario;
	}

	public JComboBox<Medico> getCombo() {
		return combo;
	}

	public JButton getBtnCambiarEstados() {
		return btnCambiarEstados;
	}

	public JButton getBtnGenerarProximosTurnos() {
		return btnGenerarProximosTurnos;
	}
}
